home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / GL / flight / ftime.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  7KB  |  283 lines

  1. /*
  2.  * Copyright 1984-1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17.  
  18. /*
  19.  *  flight/ftime.c $Revision: 1.17 $
  20.  *
  21.  *  procedures to set time sun position and shadow
  22.  */
  23.  
  24. #include "flight.h"
  25. #include "light.h"
  26. #include "sys/types.h"
  27. #include "time.h"
  28. #include <stdio.h>
  29.  
  30. #define SUNRISE    (06*60)
  31. #define SUNSET    (18*60)
  32. #define NOON    (12*60)
  33.  
  34. #define CP_NITESKY    ( 10 + ( 10<<8) + ( 20<<16))
  35. #define CP_SKYTOP    ( 60 + (140<<8) + (220<<16))
  36. #define CP_HORIZON    (110 + (190<<8) + (250<<16))
  37.  
  38. #define RGB_NITESKY     10,  10,  20
  39. #define RGB_SUNRISE1     80,  30,  20
  40. #define RGB_SUNRISE2    120,  30,  20
  41. #define RGB_HORIZON    110, 190, 250
  42. #define RGB_SKYTOP     60, 140, 220
  43.  
  44. #define FOG_NITE    0x0a, 0x0a, 0x10
  45. #define FOG_SUNRISE1    0x30, 0x10, 0x10
  46. #define FOG_SUNRISE2    0x40, 0x1a, 0x15
  47. #define FOG_DAY        0x99, 0x90, 0x99
  48.  
  49.  
  50. Matrix shadow_matrix;
  51. int ftime;
  52. int startftime;
  53. int elapsetime;
  54. long startclock;
  55. float sunx = 0.0, suny = 1.0, sunz = 0.0;
  56. int lightson;
  57.  
  58. long cp_sky, cp_W_horizon, cp_E_horizon, cp_ground;
  59.  
  60.  
  61. set_ftime(t)
  62.     int t;
  63. {
  64.     long angle;
  65.  
  66.     ftime = t % 1440;
  67.     if (ftime < 0) ftime += 1440;
  68.     startftime = elapsetime = ftime;
  69.     startclock = time(0);
  70.     angle = ((ftime<<1) + (ftime>>1)) - 900;    /* 2.5 * ftime - 900 */
  71.  
  72.     gl_sincos(angle, &suny, &sunx);
  73.     set_sun(sunx, suny, sunz);
  74.     set_lightpos(SUN, sunx, suny, sunz);
  75.     set_skycolor();
  76.     if (ftime > SUNRISE+60 && ftime < SUNSET-60)
  77.     lightson = FALSE;
  78.     else
  79.     lightson = TRUE;
  80. }
  81.  
  82. update_ftime()
  83. {
  84.     int newtime;
  85.     long angle;
  86.  
  87.     if ((newtime = startftime+((startclock-time(0))/60)) > elapsetime)
  88.     {
  89.     elapsetime = newtime;
  90.     ftime = newtime % 1440;
  91.     angle = ((ftime<<1) + (ftime>>1)) - 900;    /* 2.5 * ftime - 900 */
  92.     gl_sincos(angle, &suny, &sunx);
  93.     set_sun(sunx, suny, sunz);
  94.     set_lightpos(SUN, sunx, suny, sunz);
  95.     set_skycolor();
  96.     }
  97. }
  98.  
  99.  
  100. /*
  101.  *  set colors of sky and horizon
  102.  */
  103. set_skycolor()
  104. {
  105.     if (in_cmode)
  106.     {
  107.     float ldiv;
  108.  
  109.     if (ftime > SUNRISE-60 && ftime < SUNRISE+60)
  110.     {
  111.         ldiv = 1.0 + ((120-(ftime-(SUNRISE-60))) / 20.0);
  112.     }
  113.     else if (ftime > SUNSET-60 && ftime < SUNSET+60)
  114.     {
  115.         ldiv = 1.0 + ((ftime-(SUNSET-60)) / 20.0);
  116.     }
  117.     else if (ftime >= SUNRISE+60 && ftime <= SUNSET-60)
  118.     {
  119.         ldiv = 1.0;        /* day time */
  120.     }
  121.     else
  122.     {
  123.         ldiv = 7.0;        /* night time */
  124.     }
  125.  
  126.     init_normal_colormap(ldiv);
  127.     }
  128.     else
  129.     {
  130.     float delta;
  131.     float l = ((SUNRISE - abs(ftime - NOON)) / (float)SUNRISE);
  132.     float al = l + 0.1;
  133.  
  134.     l = (l > 0.7)? 0.7 : l;
  135.  
  136.     if (l > 0.1)
  137.         set_lightcolor(SUN, al*0.4, al*0.4, al*0.4,
  138.                (l < 0.44)? 0.44 : l, l, l);
  139.     else if (l >= 0.0)
  140.         set_lightcolor(SUN, al*0.4, al*0.4, al*0.4, l*4.4, l, l);
  141.     else if (l >= -0.1)
  142.         set_lightcolor(SUN, al*0.4, al*0.4, al*0.4, 0.0, 0.0, 0.0);
  143.     else
  144.         set_lightcolor(SUN, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
  145.  
  146.     if (ftime >= SUNSET+60 || ftime < SUNRISE-60)
  147.     {
  148.         cp_sky = cp_E_horizon = cp_W_horizon = CP_NITESKY;
  149.         set_fog_color(pack_color(FOG_NITE));
  150.     }
  151.     else if (ftime >= SUNRISE-60 && ftime < SUNRISE)
  152.     {
  153.         delta =  (ftime + 60 - SUNRISE) / 60.0;
  154.         cp_sky = cp_W_horizon = CP_NITESKY;
  155.         cp_E_horizon = comp_color(delta, RGB_NITESKY, RGB_SUNRISE1);
  156.         set_fog_color(comp_color(delta, FOG_NITE, FOG_SUNRISE1));
  157.     }
  158.     else if (ftime >= SUNRISE && ftime < SUNRISE+30)
  159.     {
  160.         delta =  (ftime - SUNRISE) / 30.0;
  161.         cp_sky = cp_W_horizon = CP_NITESKY;
  162.         cp_E_horizon = comp_color(delta, RGB_SUNRISE1, RGB_SUNRISE2);
  163.         set_fog_color(comp_color(delta, FOG_SUNRISE1, FOG_SUNRISE2));
  164.     }
  165.     else if (ftime >= SUNRISE+30 && ftime < SUNRISE+120)
  166.     {
  167.         delta =  (ftime - (SUNRISE+30)) / 90.0;
  168.         cp_sky = comp_color(delta, RGB_NITESKY, RGB_SKYTOP);
  169.         cp_E_horizon = comp_color(delta, RGB_SUNRISE2, RGB_HORIZON);
  170.         cp_W_horizon = comp_color(delta, RGB_NITESKY, RGB_HORIZON);
  171.         set_fog_color(comp_color(delta, FOG_SUNRISE2, FOG_DAY));
  172.     }
  173.     else if (ftime >= SUNRISE+120 && ftime < SUNSET-120)
  174.     {
  175.         cp_W_horizon = cp_E_horizon = CP_HORIZON;
  176.         cp_sky = CP_SKYTOP;
  177.         set_fog_color(pack_color(FOG_DAY));
  178.     }
  179.     else if (ftime >= SUNSET-120 && ftime < SUNSET-30)
  180.     {
  181.         delta =  ((SUNSET-30) - ftime) / 90.0;
  182.         cp_sky = comp_color(delta, RGB_NITESKY, RGB_SKYTOP);
  183.         cp_W_horizon = comp_color(delta, RGB_SUNRISE2, RGB_HORIZON);
  184.         cp_E_horizon = comp_color(delta, RGB_NITESKY, RGB_HORIZON);
  185.         set_fog_color(comp_color(delta, FOG_SUNRISE2, FOG_DAY));
  186.     }
  187.     else if (ftime >= SUNSET-30 && ftime < SUNSET)
  188.     {
  189.         delta =  (SUNSET - ftime) / 30.0;
  190.         cp_sky = cp_E_horizon = CP_NITESKY;
  191.         cp_W_horizon = comp_color(delta, RGB_SUNRISE1, RGB_SUNRISE2);
  192.         set_fog_color(comp_color(delta, FOG_SUNRISE1, FOG_SUNRISE2));
  193.     }
  194.     else if (ftime >= SUNSET && ftime < SUNSET+60)
  195.     {
  196.         delta =  (SUNSET + 60 - ftime) / 60.0;
  197.         cp_sky = cp_E_horizon = CP_NITESKY;
  198.         cp_W_horizon = comp_color(delta, RGB_NITESKY, RGB_SUNRISE1);
  199.         set_fog_color(comp_color(delta, FOG_NITE, FOG_SUNRISE1));
  200.     }
  201.     }
  202. }
  203.  
  204.  
  205. set_sun(x, y, z)
  206.     float x, y, z;
  207. {
  208.     identify_matrix (shadow_matrix);
  209.     shadow_matrix[1][0] = -x/y;
  210.     shadow_matrix[1][1] = 0.000001;
  211.     shadow_matrix[1][2] = -z/y;
  212. }
  213.  
  214.  
  215. draw_shadow(pp, near)
  216.     register Plane pp;
  217.     int near;
  218. {
  219.     /*
  220.      *  if it is between 5:59 PM and 6:01 AM don't draw the shadow
  221.      */
  222.     if (ftime >= SUNSET || ftime <= SUNRISE)
  223.     return;
  224.  
  225.     /*
  226.      *  cull
  227.      */
  228.     if (cull_shadow(pp, shadow_matrix[1][0], shadow_matrix[1][2]))
  229.     return;
  230.  
  231.     zbuffer(FALSE);
  232.     pushmatrix();
  233.     multmatrix(shadow_matrix);
  234.     translate(pp->x, pp->y, pp->z);
  235.     rotate(pp->azimuth, 'y');
  236.     rotate(pp->elevation, 'x');
  237.     rotate(pp->twist, 'z');
  238.  
  239.     setpattern(SHADOW_PATTERN);
  240.     if (!in_cmode)
  241.     drawobj(planeobj[pp->type], (near ? PS_SHADOW : PS_FARSHADOW) |
  242.                     (pp->weapon_state << PS_W_SHIFT));
  243.     else
  244.     drawobj(planeobj[pp->type], (near ? PS_SHADOW : PS_FARSHADOW));
  245.     setpattern(0);
  246.     popmatrix();
  247.     if (!in_cmode)
  248.     zbuffer(TRUE);
  249. }
  250.  
  251.  
  252. /*
  253.  *  get_real_time() returns the timeofday in minutes
  254.  */
  255. get_real_time()
  256. {
  257.     struct tm *tm;
  258.     long t;
  259.  
  260.     t = time(0);
  261.  
  262.     if(tm = localtime(&t))
  263.     return(tm->tm_hour * 60 + tm->tm_min);
  264.     else
  265.     return 720;        /* 12:00 noon */
  266. }
  267.  
  268.  
  269. comp_color(delta, rmin, gmin, bmin, rmax, gmax, bmax)
  270.     float delta;
  271.     long rmin, gmin, bmin, rmax, gmax, bmax;
  272. {
  273.     return((rmin+(int)(delta*(rmax-rmin)))) +
  274.       ((gmin+(int)(delta*(gmax-gmin)))<<8) +
  275.       ((bmin+(int)(delta*(bmax-bmin)))<<16);
  276. }
  277.  
  278. pack_color(r, g, b)
  279.     long r, g, b;
  280. {
  281.     return(r + (g<<8) + (b<<16));
  282. }
  283.